﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using pwblog.Entities;
using pwblog.DataAccess;

namespace pwblog.BusinessObject
{
    public class ArticleBo
    {
        private ArticleDao articleDao;

        /// <summary>
        /// hàm khởi tạo 
        /// </summary>
        public ArticleBo()
        {
            articleDao = new ArticleDao();
        }

        /// <summary>
        /// Lấy tất cả các bài viết
        /// </summary>
        /// <returns>danh sách các bài viết</returns>
        public Article[] GetArticlesAll()
        {
            return articleDao.GetArticlesAll().Reverse().ToArray();
        }

        /// <summary>
        /// Lấy tất cả các bài viết được đánh dấu xuất bản
        /// </summary>
        /// <returns>danh sách các bài viết</returns>
        public Article[] GetArticles()
        {
            return articleDao.GetArticles().Reverse().ToArray();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="article"></param>
        /// <returns></returns>
        public int InsertArticle(Article article)
        {
            return articleDao.InsertArticle(article);
        }

        /// <summary>
        /// Lấy thông tin của bài viết thông qua id
        /// </summary>
        /// <param name="p">id của bài viết</param>
        /// <returns></returns>
        public Article GetArticleById(int id)
        {
            return articleDao.GetArticleById(id);
        }

        /// <summary>
        /// cập nhật thông tin bài viết
        /// </summary>
        /// <param name="id">id bài viết</param>
        /// <param name="nameArticle">tên bài viết</param>
        /// <param name="idCategory">id của Category</param>
        /// <param name="datePost">ngày đăng bài</param>
        /// <param name="userName">tên người đăng</param>
        /// <param name="image">hình đại diện bài viết</param>
        /// <param name="viewed">số lượt xem</param>
        /// <param name="ispublished">đánh dấu xuất bản</param>
        /// <param name="ispinned">đánh dấu lên đầu</param>
        /// <returns>true/false</returns>
        public bool UpdateArticle(int id, string nameArticle, int idCategory, string datePost, string userName, 
            string image, int viewed, int ispublised, int ispinned)
        {
            try
            {
                Article article = articleDao.GetArticleById(id);
                article.Name = nameArticle;
                article.IdCategory = idCategory;
                article.DatePost = datePost;
                article.UserName = userName;
                article.Image = image;
                article.Viewed = viewed;
                article.IsPinned = ispinned;
                article.IsPublished = ispublised;
                article.DateModified = DateTime.Now;
                articleDao.UpdateArticle(article);
                
                return true;
            }
            catch(Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// Xóa bài viết theo id bài viết
        /// </summary>
        /// <param name="idArticle">id của bài viết</param>
        /// <returns>true/false</returns>
        public bool DeleteArticle(int idArticle)
        {
            try
            {
                // xoa tat ca ca comment trong bai viet
                CommentDao commentDao = new CommentDao();
                Comment[] comments = commentDao.GetCommentsByIdArticle(idArticle);
                foreach (Comment comment in comments)
                {
                    commentDao.DeleteComment(comment);
                }

                // Xoa bai viet
                Article article = articleDao.GetArticleById(idArticle);
                articleDao.DeleteArticle(article);

                return true;
            }
            catch(Exception ex)
            {
                return false;
            }
        }


        /// <summary>
        /// Thêm bài viết mới
        /// </summary>
        /// <param name="nameArticle">tên bài viết</param>
        /// <param name="idCategory">id của Category</param>
        /// <param name="datePost">ngày đăng bài</param>
        /// <param name="userName">người đăng bài</param>
        /// <param name="contents">nội dung</param>
        /// <param name="description">tóm tắt nội dung</param>
        /// <param name="image">hình đại diện bài viết</param>
        /// <returns></returns>
        public int InsertArticle(string nameArticle, int idCategory, string datePost, string userName, string description, string image, DateTime lastModified)
        {
            Article article = new Article()
            {
                Name = nameArticle,
                IdCategory = idCategory,
                DatePost = datePost,
                UserName = userName,
                Description = description,
                Image = image,
                DateModified = lastModified
            };

            int idArticle = articleDao.InsertArticle(article);

            if (idArticle > 0)
                return idArticle;
            else
                return 0;
        }

        /// <summary>
        /// cập nhật bài viết mới
        /// </summary>
        /// <param name="idArticle">id bài viết</param>
        /// <param name="nameArticle"> tên bài viết </param>
        /// <param name="idCategory"> id của Category </param>
        /// <param name="description">mô tả bài viết</param>
        /// <param name="contents">nội dung bài viết</param>
        /// <returns>true/false</returns>
        public bool UpdateArticle2(string idArticle, string nameArticle, int idCategory, string description, string image)
        {
            try
            {
                Article article = articleDao.GetArticleById(Int32.Parse(idArticle));
                article.Name = nameArticle;
                article.Image = image;
                article.IdCategory = idCategory;
                article.Description = description;
                article.DateModified = DateTime.Now;
                articleDao.UpdateArticle(article);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// Lấy tất cả bài viết 
        /// </summary>
        /// <param name="userName">tên tài khoản</param>
        /// <returns>các bài viết</returns>
        public Article[] GetArticlesByUserName(string userName)
        {
            return articleDao.GetArticlesByUserName(userName);
        }

        /// <summary>
        /// Lấy tất cả các bài viết theo id Category
        /// </summary>
        /// <param name="idCategory">id của Category</param>
        /// <returns></returns>
        public Article[] GetArticlesByCategory(string idCategory)
        {
            try
            {
                return articleDao.GetArticlesByCategory(Int32.Parse(idCategory)).Reverse().ToArray();
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// tìm kiếm bài viết
        /// </summary>
        /// <param name="key">từ khóa tìm kiếm</param>
        /// <returns></returns>
        public Article[] SearchArticle(string key)
        {
            try
            {
                return articleDao.GetArticles(key);
            }
            catch
            {
                return null;
            }

        }

        public Article[] FormatDate(Article[] source)
        {
            if (source != null && source.Length > 0)
            {
                foreach (Article art in source)
                {
                    art.DatePost = DateTime.Parse(art.DatePost).ToShortDateString();
                }
            }
            return source;
        }
    }
}